/*
 * fastcgi.h --
 *
 *      Defines for the FastCGI protocol.
 *
 *
 * Copyright (c) 1995-1996 Open Market, Inc.
 *
 * See the file "LICENSE.TERMS" for information on usage and redistribution
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
 *
 * $Id: fastcgi.h,v 1.1.1.1 2003/10/18 09:54:10 weigon Exp $
 */

/*
 * Listening socket file number
 */
#define	FCGI_LISTENSOCK_FILENO	0

typedef struct {
	unsigned char version;
	unsigned char type;
	unsigned char requestIdB1;
	unsigned char requestIdB0;
	unsigned char contentLengthB1;
	unsigned char contentLengthB0;
	unsigned char paddingLength;
	unsigned char reserved;
} FCGI_Header;

/*
 * Number of bytes in a FCGI_Header.  Future versions of the protocol
 * will not reduce this number.
 */
#define	FCGI_HEADER_LEN		8

/*
 * Value for version component of FCGI_Header
 */
#define	FCGI_VERSION_1		1

/*
 * Values for type component of FCGI_Header
 */
#define	FCGI_BEGIN_REQUEST	1
#define	FCGI_ABORT_REQUEST	2
#define	FCGI_END_REQUEST	3
#define	FCGI_PARAMS		4
#define	FCGI_STDIN		5
#define	FCGI_STDOUT		6
#define	FCGI_STDERR		7
#define	FCGI_DATA		8
#define	FCGI_GET_VALUES		9
#define	FCGI_GET_VALUES_RESULT	10
#define	FCGI_UNKNOWN_TYPE	11
#define	FCGI_MAXTYPE		(FCGI_UNKNOWN_TYPE)

/*
 * Value for requestId component of FCGI_Header
 */
#define	FCGI_NULL_REQUEST_ID	0

typedef struct {
	unsigned char roleB1;
	unsigned char roleB0;
	unsigned char flags;
	unsigned char reserved[5];
} FCGI_BeginRequestBody;

typedef struct {
	FCGI_Header header;
	FCGI_BeginRequestBody body;
} FCGI_BeginRequestRecord;

/*
 * Mask for flags component of FCGI_BeginRequestBody
 */
#define	FCGI_KEEP_CONN		1

/*
 * Values for role component of FCGI_BeginRequestBody
 */
#define	FCGI_RESPONDER		1
#define	FCGI_AUTHORIZER		2
#define	FCGI_FILTER		3

typedef struct {
	unsigned char appStatusB3;
	unsigned char appStatusB2;
	unsigned char appStatusB1;
	unsigned char appStatusB0;
	unsigned char protocolStatus;
	unsigned char reserved[3];
} FCGI_EndRequestBody;

typedef struct {
	FCGI_Header header;
	FCGI_EndRequestBody body;
} FCGI_EndRequestRecord;

/*
 * Values for protocolStatus component of FCGI_EndRequestBody
 */
#define	FCGI_REQUEST_COMPLETE	0
#define	FCGI_CANT_MPX_CONN	1
#define	FCGI_OVERLOADED		2
#define	FCGI_UNKNOWN_ROLE	3

/*
 * Variable names for FCGI_GET_VALUES / FCGI_GET_VALUES_RESULT records
 */
#define	FCGI_MAX_CONNS		"FCGI_MAX_CONNS"
#define	FCGI_MAX_REQS		"FCGI_MAX_REQS"
#define	FCGI_MPXS_CONNS		"FCGI_MPXS_CONNS"

typedef struct {
	unsigned char type;
	unsigned char reserved[7];
} FCGI_UnknownTypeBody;

typedef struct {
	FCGI_Header header;
	FCGI_UnknownTypeBody body;
} FCGI_UnknownTypeRecord;
